# 模拟ATM存取款的登录，存钱，取钱，退出操作
# 用户信息列表 [name,password,money]
Users=[{"name": "Mark", "password": "123456", "money": 13.56}, {"name": "Tom", "password": "123123", "money": 100.43}, {"name": "Jerry", "password": "456123", "money": 0.13}]


# 检测是否为纯数字
def isnan(num):
    try:
        #转换成功 返回True
        t = float(num)
        return True
    except:
        # 出现异常，代表非纯数字，返回False
        return False

# 根据密码获取用户信息
def getusermsg(password):
    # 声明空集合
    user = {}
    # 循环用户集合
    for item in Users:
        # 判断用户信息中密码是否与用户输入密码相同
        if item["password"] == password:
            # 密码相同确定用户身份
            user = item
            break
    return user


# 根据输入的操作选项，获取不同的方法调用
def getfunc(optionnum):
    return functions[optionnum]


# 查询余额
def checkmoney(password):
    # 根据用户密码获取用户信息
    usermsg = getusermsg(password)
    print("您的账户当前余额为:", usermsg["money"])
    return False


# 存款
def savemoney(password):
    money=0.00
    # 等待用户输入要存入的金额
    while True:
        money=input("请输入您要存入的金额:")
        if not isnan(money):
            print("输入的金额无法识别,请重新输入")
            continue
        else:
            break
    # 根据用户密码获取用户信息以及当前账户余额
    usermsg = getusermsg(password)
    totalmoney=usermsg["money"] + float(money)
    #更新用户账号余额
    for useritem in Users:
        if useritem["password"] == password:
            useritem["money"]=round(totalmoney,2)
            break

    print("您的账户当前余额为:%.2f"%totalmoney)
    return False


# 取款
def takemoney(password):
    money=0.00
    while True:
        money=input("请输入您要取出的金额:")
        if not isnan(money):
            print("输入的金额错误，请重新输入")
            continue
        else:
            break
    # 获取用户信息
    usermsg=getusermsg(password)
    # 检测用户账户余额是否满足取出金额
    if usermsg["money"] < float(money):
        print("您的当前账户余额不足，操作失败")
    else:
        finalMoney=usermsg["money"]-float(money)
        #更新用户的账号余额
        for item in Users:
            if item["password"]==password:
                item["money"]=round(finalMoney,2)
                break
        print("您的账号余额为：%0.2f"%finalMoney)
    return False

# 操作选项与可调用方法的字典集合
functions={"1":checkmoney,"2":savemoney,"3":takemoney}

# 死循环模拟ATM操作指令页面
while True:
    print("欢迎使用ATM存取款,请输入您的6位数字密码登录")
    # 等待用户输入登录密码
    pwd = input("密码:")
    # 判断用户密码是否大于6位
    if len(pwd) != 6:
        print("密码长度为6位,请重新输入")
        continue
    # 判断输入的密码是否为纯数字
    elif not isnan(pwd):
        print("请输入纯数字密码,重新输入")
        continue
    # 根据用户输入的密码，获取用户信息
    usermsg = getusermsg(pwd)
    # 检测是否有符合条件的用户信息
    if len(usermsg) == 0:
        print("登录失败,未查询到有效的账户信息")
        continue
    else:
        print("尊敬的",usermsg["name"],"您好")
    while True:
        print("请选择您要进行的操作")
        # 等待用户选择操作选项
        print("1.查询余额", "2.存款", "3.取款", "4.退出")
        option = input("您要进行的操作是(数字):")
        # 判断用户输入的是否为纯数字
        if not isnan(option):
            print("请输入操作对应的数字，以进行响应操作")
        # 判断用户输入的操作选项是否为有效数字
        elif int(option) < 0 or int(option) > 4:
            print("输入的操作无效,请重新选择")

        else:
            if option == "4":
                print("感谢您的使用,祝您生活愉快")
                break
            else:
                # 根据用户输入的操作选项获取对应的方法进行执行
                func = getfunc(option)
                func(pwd)

